package client.domein.dammen;

import java.awt.*;

/**
 * Klasse die valideert of een move / selectie van een bepaalde speler geldig is
 * @author Vanpoucke Sven
 *
 */
public class Validator
{
	private DammenGame game;
	
	/**
	 * Constructor
	 * @param game Actief dammengame
	 */
	public Validator(DammenGame game)
	{
		this.game = game;
	}
	
	/**
	 * Bekijkt een bepaalde zet van een bepaalde speler en bepaalt of deze zet geldig is
	 * @param m De zet van de speler
	 * @param s Speler die de zet gedaan heeft
	 * @return True indien de zet geldig is
	 */
	public boolean validateMove(Move m, Speler s)
	{
		int x1 = m.getStartPoint().x;
		int y1 = m.getStartPoint().y;
		int x2 = m.getEndPoint().x;
		int y2 = m.getEndPoint().y;
		
		int operator = (s.getStartPositie().x == 0) ? 1 : -1;
		int dx = x2 - x1;
		int dy = y2 - y1;
		
		Pion p = getPionFromPoint(m.getStartPoint(), s);
		if(p != null && p.isDubbel())
		{
			if( ((dy == 1) || (dy == -1) ) && ((dx == 1) || (dx == -1))) 
				return isEmptyPlace(m.getEndPoint());
			if( ((dy == 2) || (dy == -2) ) && ((dx == 2) || (dx == -2))) 
			{
				Point midden = new Point(m.getEndPoint().x - dx / 2, m.getEndPoint().y - dy / 2);
				return (isEmptyPlace(m.getEndPoint()) && !isEmptyPlace(midden));
			}
		}
		else
		{
			if((dy == operator) && ((dx == 1) || (dx == -1))) return isEmptyPlace(m.getEndPoint());
			if( ((dy == 2*operator)) && ((dx == 2) || (dx == -2))) 
			{
				Point midden = new Point(m.getEndPoint().x - dx / 2, m.getEndPoint().y - dy / 2);
				return (isEmptyPlace(m.getEndPoint()) && !isEmptyPlace(midden));
			}
		}

		return false;
	}
	
	/**
	 * Hulpmethode om te kijken of een bepaalde plaats op het bord leeg is
	 * @param place Plaats op het bord
	 * @return True indien de plaats leeg is
	 */
	public boolean isEmptyPlace(Point place)
	{
		for(Speler speler:game.getSpelers())
		{
			
			for(Pion pion:speler.getPionnen())
			{
				if(pion.getLocatie().equals(place))
					return false;
			}
		}
		
		return true;
	}
	
	/**
	 * Methode om te kijken of een selectie van een bepaalde speler op een bepaalde plaats geldig is
	 * @param p Plaats waarop men wil selecteren
	 * @param s Speler die wil selecteren
	 * @return True indien de selectie geldig is
	 */
	public boolean validateSelection(Point p, Speler s)
	{
		Pion pion = getPionFromPoint(p, s);
		if(pion != null) return true;
		
		return false;
	}
	
	/**
	 * Hulpmethode die een pion terug geeft die op een gegeven locatie staat
	 * @param p Locatie op welke men de pion wil 
	 * @param s Speler tot wie de pion behoort
	 * @return Pion die tot de bepaalde plaats behoort
	 */
	public Pion getPionFromPoint(Point p, Speler s)
	{
		for(Pion pi : s.getPionnen())
			if(pi.getLocatie().equals(p))
				return pi;
		
		return null;
	}
}
